import requests

def send_request(
    method: str,
    url: str,
    params: dict = None,
    data: dict = None,
    json: dict = None,
    headers: dict = None,
    cookies: dict = None,
    timeout: int = 10,
    show_log: bool = False
):
    """
    发送 HTTP 请求的通用工具函数。

    :param method: 请求方法（GET、POST、PUT、DELETE 等）
    :param url: 请求地址
    :param params: URL 参数（GET 请求使用）
    :param data: 表单数据（POST 请求使用）
    :param json: JSON 数据（POST/PUT 等使用）
    :param headers: 请求头
    :param cookies: cookies
    :param timeout: 超时时间（秒）
    :param show_log: 是否打印请求和响应信息
    :return: 响应对象（成功时）或 None（失败时）
    """
    # 设置默认 headers
    if headers is None:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36"
        }

    try:
        if show_log:
            print(f"【发送请求】{method} {url}")
            if params:
                print("Params:", params)
            if data:
                print("Form Data:", data)
            if json:
                print("JSON Data:", json)

        # 使用 Session 保持 Cookie（如需）
        with requests.Session() as session:
            response = session.request(
                method=method,
                url=url,
                params=params,
                data=data,
                json=json,
                headers=headers,
                cookies=cookies,
                timeout=timeout
            )

            # 检查 HTTP 状态码是否为成功
            response.raise_for_status()

            # 自动解析响应内容
            try:
                result = response.json()
                if show_log:
                    print("【响应内容】JSON 数据：", result)
            except ValueError:
                result = response.text
                if show_log:
                    print("【响应内容】文本数据：", result[:200] + "...")  # 只打印前200字符

            return result

    except requests.exceptions.HTTPError as e:
        print("【HTTP 错误】", e)
    except requests.exceptions.ConnectionError:
        print("【连接错误】网络连接失败，请检查网络")
    except requests.exceptions.Timeout:
        print("【请求超时】", timeout, "秒内未收到响应")
    except requests.exceptions.RequestException as e:
        print("【请求异常】", e)

    return None